package fr.uniscol.siecle.dao.impl;

import fr.uniscol.dao.UniscolDaoSupport;
import fr.uniscol.dao.impl.SQLNames;
import static fr.uniscol.dao.impl.SQLNames.*;
import fr.uniscol.model.BaseAnneeScolaire;
import fr.uniscol.model.EtablissementModel;
import fr.uniscol.model.RapportTraitement;
import fr.uniscol.siecle.dao.IDonneesSIECLENomenclaturesDao;
import fr.uniscol.siecle.dao.IImportDonneesSIECLEDao;
import fr.uniscol.siecle.dao.SynchroniserNomenclaturesStoredProcedure;
import fr.uniscol.siecle.model.FichierSIECLE;
import fr.uniscol.siecle.model.MEF;
import fr.uniscol.siecle.model.Matiere;
import fr.uniscol.siecle.model.ModaliteElection;
import fr.uniscol.siecle.model.Nomenclatures;
import fr.uniscol.siecle.model.OptionObligatoire;
import fr.uniscol.siecle.model.Programme;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;

@Repository("donneesNomenclaturesDao")
public class DonneesSIECLENomenclaturesDaoImpl extends UniscolDaoSupport implements IDonneesSIECLENomenclaturesDao, IImportDonneesSIECLEDao {

    public static Logger log = Logger.getLogger(DonneesSIECLENomenclaturesDaoImpl.class);
    
	private SynchroniserNomenclaturesStoredProcedure synchroniserProcedure;
	
	public DonneesSIECLENomenclaturesDaoImpl(){
	}
	
	@Override
	public Nomenclatures getDonneesNomenclatures(int annee, long etabId) {
		return null;
	}

	@Override
	public boolean saveFichierSIECLE(BaseAnneeScolaire base, FichierSIECLE fichier, RapportTraitement rapport) {
		
		Nomenclatures nomenclatures = (Nomenclatures) fichier;
		
		/*String reqUpdate = "UPDATE bee_nomenclatures "
				+ "			SET annee_scolaire=?,"
				+ "             date_export=?,"
				+ "             horodatage=? "
				+ "         WHERE annee=? AND etablissementid=? ";
		
		String reqInsert = "INSERT INTO bee_nomenclatures(annee, etablissementid,"
				+ "										  annee_scolaire, date_export, horodatage)"
				+ "         VALUES(?, ?,"
				+ "				   ?, ?, ?)";
		
		int nbRowsAffected = getJdbcTemplate().update(reqUpdate, new Object[]{
				nomenclatures.getParametres().getAnneeScolaire(),
				nomenclatures.getParametres().getDateExport(),
				nomenclatures.getParametres().getHorodatage(),
				base.getAnnee(), 
				base.getEtablissement().getId()
		});
		
		if(nbRowsAffected == 0){
			nbRowsAffected = getJdbcTemplate().update(reqInsert, new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId(),
				nomenclatures.getParametres().getAnneeScolaire(),
				nomenclatures.getParametres().getDateExport(),
				nomenclatures.getParametres().getHorodatage()
			});
		}
		if(nbRowsAffected != 1){
			throw new NullPointerException("Nombre de lignes mises à jour incorrect !");
		}
		
		getJdbcTemplate().update("DELETE FROM bee_programme WHERE  annee=? AND etablissementid=? ", new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId()
		});
		getJdbcTemplate().update("DELETE FROM bee_options_obligatoires WHERE  annee=? AND etablissementid=? ", new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId()
		});
		
		getJdbcTemplate().update("DELETE FROM bee_mef WHERE annee=? AND etablissementid=? ", new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId()
		});
            */
		
		boolean enregistrementMefsOK = true;
		for(MEF m : nomenclatures.getMefs()){
			enregistrementMefsOK &= saveMef(base, nomenclatures, m);
		}
        
		/*
		getJdbcTemplate().update("DELETE FROM bee_matiere WHERE  annee=? AND etablissementid=? ", new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId(),
		});*/
		boolean enregistrementMatieresOK = true;
		for(Matiere mat : nomenclatures.getMatieres()){
			enregistrementMatieresOK &= saveMatiere(base, nomenclatures, mat);
		}
        
		/*
		getJdbcTemplate().update("DELETE FROM bee_modalite WHERE  annee=? AND etablissementid=? ", new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId(),
		});
		
		boolean enregistrementModalitesOK = true;
		for(ModaliteElection mod : nomenclatures.getModalites()){
			enregistrementModalitesOK &= saveModaliteElection(base, nomenclatures, mod);
		}*/
		/*
		boolean enregistrementOptionsOK = true;
		for(OptionObligatoire opt : nomenclatures.getOptionsObligatoires()){
			enregistrementOptionsOK &= saveOptionObligatoire(base, nomenclatures, opt);
		}*/
		getJdbcTemplate().update("DELETE FROM " + TABLE_PROGRAMME + " WHERE baseid=?", new Object[]{
           base.getId()
        });
        
		boolean enregistrementProgrammesOK = true;
		for(Programme pr : nomenclatures.getProgrammes()){
			enregistrementProgrammesOK &= saveProgramme(base, nomenclatures, pr);
		}
		
		return enregistrementMefsOK 
				&& enregistrementMatieresOK
				//&& enregistrementModalitesOK 
				//&& enregistrementOptionsOK 
				&& enregistrementProgrammesOK;
	}

	private boolean saveMef(BaseAnneeScolaire base, Nomenclatures nomenclatures, MEF m) {
		
		/*String reqInsert = "INSERT INTO bee_mef (annee, etablissementid, code,"
				+ "								 formation, specialite, libelle_long, statut_mef, code_mefstat,"
				+ "                              nb_opt_oblig, nb_opt_mini, renf_lang, inscript_etab, mef_orig,"
				+ "                              date_ouverture, date_fermeture)"
				+ "  VALUES(?, ?, ?,"
				+ "								 ?, ?, ?, ?, ?,"
				+ "                              ?, ?, ?, ?, ?,"
				+ "                              ?, ?)";
		
		int nbRowsAffected = getJdbcTemplate().update(reqInsert, new Object[]{
			base.getAnnee(), 
			base.getEtablissement().getId(),
			m.getCode(),
			m.getFormation(),
			m.getSpecialite(),
			m.getLibelle_long(),
			m.getStatut_mef(),
			m.getCode_mefstat(),
			m.getNb_opt_oblig(),
			m.getNb_opt_mini(),
			m.getRenforcement_langues(),
			m.getInscription_etab(),
			m.getMef_origine(),
			m.getDate_ouverture(),
			m.getDate_fermeture()
		});
		*/
        
        int nbRowsAffected = getJdbcTemplate().update("UPDATE " + TABLE_MEF + " SET libelle_court=?,libelle_long=? WHERE id_siecle=? AND baseid=? ", new Object[]{
            m.getFormation(),
            m.getLibelle_long(),
            m.getCode(),
            base.getId()
        });
        
        if(nbRowsAffected == 0){
            nbRowsAffected = getJdbcTemplate().update("INSERT INTO " + TABLE_MEF + " (baseid, libelle_court, libelle_long, id_siecle) VALUES(?,?,?,?)", new Object[]{
               base.getId(),
               m.getFormation(),
               m.getLibelle_long(),
               m.getCode()
            });
        }
        
        log.debug("MEF: baseId=" + base.getId() + ", libelle=" + m.getLibelle_long() + ", code=" + m.getCode());
        
		return nbRowsAffected == 1;
	}

	private boolean saveMatiere(BaseAnneeScolaire base, Nomenclatures nomenclatures, Matiere mat) {
		
		/*String reqInsert = "INSERT INTO bee_matiere (annee, etablissementid, code,"
				+ "									 libelle_court, libelle_long, libelle_edition,"
				+ "                                  code_gestion, matiere_etp)"
				+ "  VALUES(?, ?, ?,"
				+ "									 ?, ?, ?,"
				+ "                                  ?, ?)";
		
		int nbRowsAffected = getJdbcTemplate().update(reqInsert, new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId(),
				mat.getCode(),
				mat.getLibelle_court(),
				mat.getLibelle_long(),
				mat.getLibelle_edition(),
				mat.getCode_gestion(),
				mat.getMatiere_etp()
		});*/
        
        int nbRowsAffected = getJdbcTemplate().update("UPDATE " + TABLE_MATIERE + " SET libelle_court=?,libelle_long=?,libelle=? WHERE id_siecle=? AND baseid=? ", new Object[]{
           mat.getLibelle_court(),
           mat.getLibelle_long(),
           mat.getLibelle_edition(),
           mat.getCode(),
           base.getId()
        });
        
        if(nbRowsAffected == 0){
            nbRowsAffected = getJdbcTemplate().update("INSERT INTO " + TABLE_MATIERE + " (baseid,libelle_court,libelle_long,libelle,id_siecle) VALUES(?,?,?,?,?)", new Object[]{
               base.getId(),
               mat.getLibelle_court(),
               mat.getLibelle_long(),
               mat.getLibelle_edition(),
               mat.getCode()
            });
        }
        
        log.debug("MATIERE: baseId=" + base.getId() + ", libelle=" + mat.getLibelle_edition() + ", code=" + mat.getCode());
			
		return nbRowsAffected == 1;
	}

	/*private boolean saveModaliteElection(BaseAnneeScolaire base, Nomenclatures nomenclatures, ModaliteElection mod) {
		
		String reqInsert = "INSERT INTO bee_modalite (annee, etablissementid, code, libelle_court, libelle_long)"
				+ " VALUES(?, ?, ?, ?, ?)";
		
		int nbRowsAffected = getJdbcTemplate().update(reqInsert, new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId(),
				mod.getCode(),
				mod.getLibelle_court(),
				mod.getLibelle_long()
		});
			
		return nbRowsAffected == 1;
	}

	private boolean saveOptionObligatoire(BaseAnneeScolaire base, Nomenclatures nomenclatures, OptionObligatoire opt) {
		
		String reqInsert = "INSERT INTO bee_options_obligatoires (annee, etablissementid, "
				+ "											      code_mef, code_matiere, rang_option)"
				+ " VALUES(?, ?, ?, ?, ?)";
		
		int nbRowsAffected = getJdbcTemplate().update(reqInsert, new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId(),
				opt.getMef().getCode(),
				opt.getMatiere().getCode(),
				opt.getRang_option()
		});
		
		return nbRowsAffected == 1;
	}*/
	
	private boolean saveProgramme(BaseAnneeScolaire base, Nomenclatures nomenclatures, Programme pr) {
		
		/*String reqInsert = "INSERT INTO bee_programme (annee, etablissementid, "
				+ "											      code_mef, code_matiere, code_modalite, horaire)"
				+ " VALUES(?, ?, ?, ?, ?, ?)";
		
		int nbRowsAffected = getJdbcTemplate().update(reqInsert, new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId(),
				pr.getMef().getCode(),
				pr.getMatiere().getCode(),
				pr.getModalite().getCode(),
				pr.getHoraire()
		});
			*/
        
        log.debug("PROGRAMME: baseId=" + base.getId() + ", mef=" + pr.getMef().getCode() + ", mat=" + pr.getMatiere().getCode());
        
        int nbRowsAffected = getJdbcTemplate().update("INSERT INTO " + TABLE_PROGRAMME + " (baseid,mefid,matiereid,modalite) VALUES(?,getMefByCodeSiecle(?,?),getMatiereIdByIdSiecle(?,?),?)", new Object[]{
           base.getId(),
           base.getId(),
           pr.getMef().getCode(),
           base.getId(),
           pr.getMatiere().getCode(),
           pr.getModalite().getCode()
        });
        
		return nbRowsAffected == 1;
	}
}
